package com.ylwl.datacenterdemo.util;

import com.ylwl.datacenterdemo.entity.ExcelHeader;
import com.ylwl.datacenterdemo.entity.TableMetadata;
import com.ylwl.datacenterdemo.service.FieldNameGenerator;
import com.ylwl.datacenterdemo.service.TableStructureManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicTableUtil {

    private final TableStructureManager tableStructureManager;
    private final FieldNameGenerator fieldNameGenerator;
    private final TableNameConverter tableNameConverter;

    /**
     * 检查表是否存在，如果不存在则创建表
     * @param tableName 表名
     */
    public void createTableIfNotExists(String tableName) {
        try {
            // 检查表是否已存在
            if (!tableStructureManager.doesTableExist(tableName)) {
                // 创建表的SQL语句
                String createTableSql = "CREATE TABLE `" + tableName + "` (" +
                        "id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', " +
                        "data JSON COMMENT '数据内容', " +
                        "create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', " +
                        "PRIMARY KEY (id)" +
                        ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动态表_" + tableName + "'";

                // 这里应该使用JdbcTemplate，但由于我们重构了代码，这部分功能暂时保留向后兼容
                log.warn("createTableIfNotExists方法已被弃用，请使用新的TableStructureManager");
            } else {
                log.info("表 {} 已存在，无需创建", tableName);
            }
        } catch (Exception e) {
            log.error("创建表 {} 时出错: ", tableName, e);
            throw new RuntimeException("创建表失败: " + tableName, e);
        }
    }

    /**
     * 根据表头信息创建表结构
     * @param tableName 表名
     * @param headMap 表头信息(key为列索引，value为列名)
     * @return 列索引到唯一字段名的映射
     */
    public Map<Integer, String> createTableWithColumns(String tableName, Map<Integer, String> headMap) {
        // 创建表头对象列表
        List<ExcelHeader> headers = new ArrayList<>();
        for (Map.Entry<Integer, String> entry : headMap.entrySet()) {
            ExcelHeader header = new ExcelHeader(entry.getKey(), entry.getValue());
            headers.add(header);
        }
        
        // 创建表元数据
        TableMetadata metadata = new TableMetadata(tableName);
        metadata.setHeaders(headers);
        
        // 生成字段名映射
        Map<Integer, String> fieldMap = fieldNameGenerator.generateFieldNames(headers);
        metadata.setColumnIndexToFieldMap(fieldMap);
        
        // 创建表结构
        tableStructureManager.createTableStructure(metadata);
        
        return fieldMap;
    }

}